package co.edu.eam.persitencia.entidades;

import java.util.Date;

import co.edu.eam.persitencia.enumeraciones.GrupoTerapeuticoEnum;
import co.edu.eam.persitencia.enumeraciones.PresentacionEnum;
import java.util.List;
import javax.persistence.Column;
import javax.persistence.Entity;
import javax.persistence.EnumType;
import javax.persistence.Enumerated;
import javax.persistence.JoinColumn;
import javax.persistence.ManyToOne;
import javax.persistence.NamedQueries;
import javax.persistence.NamedQuery;
import javax.persistence.Table;
import javax.persistence.Temporal;

/**
 * Entidad que representa el medicamento.
 *
 */
@NamedQueries({
    @NamedQuery(name = Medicamento.FIND_MEDICAMENTO_BY_LABORATORIO,
    query = ("SELECT medicamento FROM Medicamento medicamento WHERE "
    + "medicamento.laboratorio=:medicamento" + Medicamento.PARAMENTRO_LABORATORIO)),
    @NamedQuery(name = Medicamento.FIND_ALL, query = ("SELECT medicamento FROM Medicamento medicamento"))
})
@Entity
@Table(name = "clinica_medicamento")
public class Medicamento extends Articulo {

    /**
     * Constante de serializaci�n.
     */
    private static final long serialVersionUID = 1L;
    /**
     * Constante para el parametro laboratorio.
     */
    public static final String PARAMENTRO_LABORATORIO = "laboratorio";
    /**
     * Constante para la named query de buscar medicamento por nombre.
     */
    public static final String FIND_MEDICAMENTO_BY_LABORATORIO = "Medicamento.findMedicamentoByLaboratorio";
    /**
     * constante para la named query de buscar todos los medicamentos
     */
    public static final String FIND_ALL = "Medicamento.finAll";
    /**
     * Grupo terapeutico del medicamento.
     */
    @Column(name = "medicamento_grupoTerapeutico")
    @Enumerated(EnumType.STRING)
    private GrupoTerapeuticoEnum grupoTerapeutico;
    /**
     * Registro Invima del medicamento.
     */
    @Column(name = "medicamento_registroInvima")
    private String registroInvima;
    /**
     * Presentaci�n del medicamento.
     */
    @ManyToOne
    @JoinColumn(name = "medicamento_presentacion")
    @Enumerated(EnumType.STRING)
    private PresentacionEnum presentacion;
    /**
     * Consentraci�n del medicamento.
     */
    @Column(name = "medicamento_consentracion")
    private String consentracion;
    /**
     * Laboratirio donde se creo el medicamento.
     */
    @ManyToOne
    @JoinColumn(name = "medicamento_laboratorio")
    private Laboratorio laboratorio;
    /**
     * Fecha de vencimiento del medicamento.
     */
    @Temporal(javax.persistence.TemporalType.DATE)
    @Column(name = "medicamento_fechaVencimiento")
    private Date fechaVencimieno;
    /**
     * Si el medicamento se tiene que autorizar o no.
     */
    @Column(name = "medicamento_noPos")
    private boolean noPos;

    /**
     * Constructor sin parametros.
     */
    public Medicamento() {
        super();
    }

    public Medicamento(Long id, String nombre, String consentracion,
            GrupoTerapeuticoEnum grupoTerapeutico, PresentacionEnum presentacion,
            String registroInvima, Laboratorio laboratorio, boolean noPos) {
        this.grupoTerapeutico = grupoTerapeutico;
        this.registroInvima = registroInvima;
        this.presentacion = presentacion;
        this.consentracion = consentracion;
        this.laboratorio = laboratorio;
        this.noPos = noPos;
    }

    public Medicamento(Long id, String codigo, String nombre, double precio, int cantidad, List<DetalleFormulaMedica> detallesFormulaMedica, List<Inventario> inventario, GrupoTerapeuticoEnum grupoTerapeutico, String registroInvima, PresentacionEnum presentacion, String consentracion, Laboratorio laboratorio, Date fechaVencimieno, boolean noPos) {
        super(id, codigo, nombre, precio, cantidad, detallesFormulaMedica, inventario);
        this.grupoTerapeutico = grupoTerapeutico;
        this.registroInvima = registroInvima;
        this.presentacion = presentacion;
        this.consentracion = consentracion;
        this.laboratorio = laboratorio;
        this.fechaVencimieno = fechaVencimieno;
        this.noPos = noPos;
    }

    /**
     * @return the grupoTerapeutico
     */
    public GrupoTerapeuticoEnum getGrupoTerapeutico() {
        return grupoTerapeutico;
    }

    /**
     * @param grupoTerapeutico the grupoTerapeutico to set
     */
    public void setGrupoTerapeutico(GrupoTerapeuticoEnum grupoTerapeutico) {
        this.grupoTerapeutico = grupoTerapeutico;
    }

    /**
     * @return the registroInvima
     */
    public String getRegistroInvima() {
        return registroInvima;
    }

    /**
     * @param registroInvima the registroInvima to set
     */
    public void setRegistroInvima(String registroInvima) {
        this.registroInvima = registroInvima;
    }

    /**
     * @return the presentacion
     */
    public PresentacionEnum getPresentacion() {
        return presentacion;
    }

    /**
     * @param presentacion the presentacion to set
     */
    public void setPresentacion(PresentacionEnum presentacion) {
        this.presentacion = presentacion;
    }

    /**
     * @return the consentracion
     */
    public String getConsentracion() {
        return consentracion;
    }

    /**
     * @param consentracion the consentracion to set
     */
    public void setConsentracion(String consentracion) {
        this.consentracion = consentracion;
    }

    /**
     * @return the laboratorio
     */
    public Laboratorio getLaboratorio() {
        return laboratorio;
    }

    /**
     * @param laboratorio the laboratorio to set
     */
    public void setLaboratorio(Laboratorio laboratorio) {
        this.laboratorio = laboratorio;
    }

    /**
     * @return the detallesFabricante
     */
    /**
     * @return the fechaVencimieno
     */
    public Date getFechaVencimieno() {
        return fechaVencimieno;
    }

    /**
     * @param fechaVencimieno the fechaVencimieno to set
     */
    public void setFechaVencimieno(Date fechaVencimieno) {
        this.fechaVencimieno = fechaVencimieno;
    }

    /**
     * @return the noPos
     */
    public boolean isNoPos() {
        return noPos;
    }

    /**
     * @param noPos the noPos to set
     */
    public void setNoPos(boolean noPos) {
        this.noPos = noPos;
    }
    //TODO:falta toString
}
